#include <stdio.h>
#include <string.h>
#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"

#include "iot_uart.h"
#include "iot_gpio.h"   // OpenHarmony HAL：IoT硬件设备操作接口-GPIO
#include "iot_errno.h"  // OpenHarmony HAL：IoT硬件设备操作接口-错误代码定义

#include "hi_io.h"      // 海思 Pegasus SDK：IoT硬件设备操作接口-IO
#include "hi_adc.h"     // 海思 Pegasus SDK：IoT硬件设备操作接口-ADC
#include <string.h>
#include <stdlib.h>


#define IOT_UART_IDX_2 2
#define MAX_SIZE 512


void GPSInit()
{
    uint32_t ret;
    int i=0;
    
    // 这部分代码为UART初始化的代码，首先要在uart_attr结构体这配置波特率、数据位、停止位、奇偶检验位，然后通过UartInit()函数对串口1进行配置。
    IotUartAttribute uart_attr = 
    {

        .baudRate = 9600,

        .dataBits = 8,
        .stopBits = 1,
        .parity = 0,
    };

    //初始化引脚
    IoTGpioInit(HI_IO_NAME_GPIO_12);
    IoTGpioInit(HI_IO_NAME_GPIO_11);
    //设置为引脚功能为RX TX
    hi_io_set_func(HI_IO_NAME_GPIO_12,HI_IO_FUNC_GPIO_12_UART2_RXD);
    hi_io_set_func(HI_IO_NAME_GPIO_11,HI_IO_FUNC_GPIO_11_UART2_TXD);

    ret = IoTUartInit(IOT_UART_IDX_2, &uart_attr);
    if (ret != IOT_SUCCESS)
    {
        printf("Failed to init uart! Err code = %d\n", ret);
        return;
    }

    printf("Uart Test Start!!!\n");
        
}


// 将度分格式转换为十进制度
double nmea_to_decimal(double nmea_coord, char direction) {
    // 提取度部分
    double degrees = floor(nmea_coord / 100);
    // 提取分部分并转换为度
    double minutes = nmea_coord - (degrees * 100);
    // 计算十进制度数
    double decimal = degrees + (minutes / 60.0);
    
    // 根据方向调整符号
    if (direction == 'S' || direction == 'W') {
        decimal = -decimal;
    }
    
    return decimal;
}


int ReadGPS(double *W,double *E)
{
    unsigned char data[MAX_SIZE]={0};
    usleep(100);
    uint32_t ret=IoTUartRead(IOT_UART_IDX_2,data,MAX_SIZE);

    if (ret != IOT_SUCCESS)
    {
        printf("Failed to read data\r\n");

    }
    // printf("\r\n--------------------------------------------------------------\r\n");
    // printf("The serial port information output by the GPS module is : \r\n");
    // printf("%s\n",data);

    char *gngga = strstr(data,"$GNGGA");

    if(gngga==NULL)
    {
        printf("GNGGA data not found\r\n");

    }

    char *token;
    token =strtok(gngga,",");
    char *fields[15];
    //printf("分割后的数据为token=%s\r\n",token);

    int i = 0;
    while (token != NULL) {
        fields[i++] = token;
        token = strtok(NULL, ",");
        if (i >= 15) break;
    }
    // 获取第3,4,5,6个字段的值(即GPS模块接收的经纬度坐标)
            
            char ddmm_output[256];
            if (i >= 6 && fields[2] != NULL && fields[4] != NULL) 
            {  

                   //将第3,4,5,6个字段的值合并在一起，即ddmm_output的值为GPS模块接收的经纬度坐标(ddmm.mmmmm格式),例如3209.22695 N,11841.95567 E
                   //当GPS没有连接信号时，这个数值打印出来是错误的。
                   //nmea_fields[2]表示纬度 
                   //nmea_fields[3]来判断是北纬还是南纬，
                   //nmea_fields[4]表示经度，
                   //nmea_fields[5]来判断是东经还是西经
                   sprintf(ddmm_output, "%s %s,%s %s", fields[2], fields[3], fields[4], fields[5]);
                   printf("[$GNGGA,WGS-84]Latitude and longitude data (ddmm.mmmmm) is : %s \n", ddmm_output);//ddmm_output的值为GPS模块接收的经纬度坐标(ddmm.mmmmm格式)

                   /******将GPS $GNGGA ddmm.mmmm（度分）转换成常用坐标dd.ddddd******/
                   //将字符数组nmea_fields[2]转换为double类型
                   double num0= 0.0;
                   num0 = atof(fields[2]);
                   char lat_direction=fields[3][0];
                    nmea_to_decimal(num0,lat_direction);

                   //将字符数组nmea_fields[4]转换为double类型
                   double num1 = 0.0;
                   num1 = atof(fields[4]);
                   char lon_direction=fields[5][0];
                   nmea_to_decimal(num1,lon_direction);


                   printf("[$GNGGA,WGS-84]Latitude and longitude data (dd.ddddd) is : %0.5lf\n", num0);
                   printf("[$GNGGA,WGS-84]Latitude and longitude data (dd.ddddd) is : %0.5lf\n", num1);
                   
                   *W=num0;
                   *E=num1;
                   return 0;
            } 
            else 
            { 
                printf("[$GNGGA]Latitude and longitude data no found\n"); 
                return 1;
            }

}
